package geradatawarehouse.runnable;

import geradatawarehouse.dao.oracle.AnoSemDAO;
import geradatawarehouse.dao.postgres.AlunoAuxTablesPostgresDAO;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

public class AlunoEJAWorker implements Runnable {

	private static final Logger LOGGER = Logger.getLogger(AlunoEJAWorker.class);

	@Override
	public void run() {

		AlunoEJAWorker.LOGGER.info("Iniciando a Atualização do EJA");

		List<Integer> anoSemList = new ArrayList<Integer>();

		boolean isAnoSemListSuccessfull = false;

		try {
			final AnoSemDAO anoSemDAO = new AnoSemDAO();
			anoSemList = anoSemDAO.findAll(true);
			isAnoSemListSuccessfull = true;
		} catch (IOException e) {
			AlunoEJAWorker.LOGGER.error(e);
		} catch (SQLException e) {
			AlunoEJAWorker.LOGGER.error(e);
		}

		if (!isAnoSemListSuccessfull) {
			AlunoEJAWorker.LOGGER
					.error("Erro na recuperação da lista de AnoSem");
		}

		for (final Integer anoSem : anoSemList) {

			AlunoEJAWorker.LOGGER.info("Iniciando a atualização do ano "
					+ anoSem);

			AlunoEJARecorder recorder = null;

			AlunoEJALoader alunoEJALoader = null;

			try {
				recorder = new AlunoEJARecorder(anoSem);
				alunoEJALoader = new AlunoEJALoader(anoSem, recorder);
			} catch (IOException e) {
				AlunoEJAWorker.LOGGER.error(e);
				AlunoEJAWorker.LOGGER.error("Erro na recuperação do semestre: "
						+ anoSem);
				break;
			}

			final Thread loaderThread = new Thread(alunoEJALoader,
					"AlunoEJALoader " + anoSem);

			loaderThread.start();
			recorder.setLoaderThread(loaderThread);

			final Thread recorderThread = new Thread(recorder,
					"AlunoEJARecorder " + anoSem);

			recorderThread.start();
			try {
				loaderThread.join();
				recorderThread.join();
				AlunoEJAWorker.LOGGER.info("Finalizada a atualização do ano "
						+ anoSem);
			} catch (InterruptedException e) {
				AlunoEJAWorker.LOGGER.error(e);
			}
		}

		AlunoAuxTablesPostgresDAO dao = null;

		boolean isUpdateTablesSuccessful = false;

		try {
			dao = new AlunoAuxTablesPostgresDAO(true);
			dao.updateTables();
			isUpdateTablesSuccessful = true;
		} catch (IOException e) {
			AlunoEJAWorker.LOGGER.error(e);
		} catch (SQLException e) {
			AlunoEJAWorker.LOGGER.error(e);
		}

		if (!isUpdateTablesSuccessful) {
			AlunoEJAWorker.LOGGER
					.error("Erro na atualização das tabelas auxiliares");
		}

		AlunoEJAWorker.LOGGER.info("Finalizada a Atualização do EJA");

	}
}
